<!DOCTYPE html>
<html>
  <head>
    <meta charset='utf-8'>

    <link rel="stylesheet" type="text/css" 
      href="/assets/css/straybirds.css" media="screen" />
    <link rel="stylesheet" type="text/css" 
      href="/assets/css/pygments.css" media="screen" />

    <!-- MathJax Section Start -->

    <script type="text/javascript"
    src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
    </script>
    <script>
        MathJax.Hub.Config({
              tex2jax: {
              skipTags: ['script', 'noscript', 'style', 'textarea', 'pre']
              }
        });
        MathJax.Hub.Queue(function() {
            var all = MathJax.Hub.getAllJax(), i;
            for(i=0; i < all.length; i += 1) {
                all[i].SourceElement().parentNode.className += ' has-jax';
            }
        });
    </script>

    <!-- MathJax Section End -->

    <!-- Google Analytics Start-->
    <script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-48100787-1', 'minixalpha.github.io');
  ga('send', 'pageview');

</script>

    <!-- Google Analytics End -->

    <title>Python包管理不同方式的区别</title>
  </head>

  <body>
    <div class="container">
      <header>
        <div class="container">
          <h1>
              <a href="/" title="Home Page"> 潇湘夜雨 </a>
          <span class="github-src">
            <a href ="https://github.com/minixalpha/minixalpha.github.io"
               target="_blank"
               title="Fork me on GitHub">
              <img src="/assets/images/GitHub-Mark-Light-32px.png" alt="">
            </a>
          </span>
          </h1>
        </div>
      </header>

      <aside id="left-side">
        <h2> 分类 </h2>
  <ul class="category-list">
      
            
                <li>
                <a href="/categories/计算机系统"> 计算机系统 (3) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/java"> java (1) </a>
                </li>
            
      
            
                <li style="background-color: #444">
                <a href="/categories/技术"> 技术 (5) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/工具"> 工具 (4) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/科研"> 科研 (5) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/生活"> 生活 (1) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/思想"> 思想 (2) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/c语言"> c语言 (4) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/虚拟机"> 虚拟机 (1) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/英语"> 英语 (8) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/读书"> 读书 (1) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/源代码阅读"> 源代码阅读 (10) </a>
                </li>
            
      
  </ul>

      </aside>

      <aside id="right-side">
        <h2> 归档 </h2>
  <ul class="archive-list">
    
    
    
        
        
        
        
            
            <li>
                <a href="/2014/05">
                    2014-05 (1)
                </a>
            </li>

        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
            
            <li>
                <a href="/2014/04">
                    2014-04 (3)
                </a>
            </li>

        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
            
            <li>
                <a href="/2014/03">
                    2014-03 (11)
                </a>
            </li>

        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
            
            <li>
                <a href="/2014/02">
                    2014-02 (6)
                </a>
            </li>

        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
            
            <li>
                <a href="/2014/01">
                    2014-01 (3)
                </a>
            </li>

        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
            
            <li>
                <a href="/2013/11">
                    2013-11 (10)
                </a>
            </li>

        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
            
            <li>
                <a href="/2013/10">
                    2013-10 (3)
                </a>
            </li>

        
        
    
  </ul>

      </aside>

      <article>

<h1>Python包管理不同方式的区别</h1>

<p>学习Python已经有一段时间，经常会遇到安装各种包的问题，一会 <code>setup.py</code>，
一会 <code>easy_install</code>，一会又是<code>pip</code>，还有一些概念比如<code>distutils</code>，
<code>setuptools</code>等等，搞不清楚谁是谁，什么时候应该用什么，今天就把这些概念
澄清一下。</p>

<h2>distutils</h2>

<p>distutils是Python标准库的一部分，其初衷是为开发者提供一种方便的打包方式，
同时为使用者提供方便的安装方式。</p>

<p>例如你创建了一个名为foo的包，包含一个foo.py文件，你想把它打包以便其它人使用。
这时候你需要写一个setup.py文件：   </p>
<div class="highlight"><pre><code class="python language-python" data-lang="python"><span class="kn">from</span> <span class="nn">distutils.core</span> <span class="kn">import</span> <span class="n">setup</span>
<span class="n">setup</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;foo&#39;</span><span class="p">,</span>
      <span class="n">version</span><span class="o">=</span><span class="s">&#39;1.0&#39;</span><span class="p">,</span>
      <span class="n">py_modules</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;foo&#39;</span><span class="p">],</span>
      <span class="p">)</span>
</code></pre></div>
<p>然后运行命令</p>
<div class="highlight"><pre><code class="text language-text" data-lang="text">$python setup.py sdist
</code></pre></div>
<p>然后你发现当前目录下出现一个名为dist的文件夹，里面有一个foo-1.0.tar.gz的包。
这个包里有三个文件，foo.py, setup.py, PKG-INFO，前两个文件和我们之前提到的两个文件一样。
PKG-INFO是关于包的一些信息。然后你就可以把foo-1.0.tar.gz给别人安装了。</p>

<p>安装者要使用这个包时，只需要解压这个foo-1.0.tar.gz文件，再运行命令</p>
<div class="highlight"><pre><code class="text language-text" data-lang="text">$python setup install
</code></pre></div>
<p>这个包就会被自动安装到系统合适的位置。</p>

<h2>setuptools</h2>

<p><a href="http://peak.telecommunity.com/DevCenter/setuptools">setuptools</a> 是对 distutils 的增强,
尤其是引入了包依赖管理。</p>

<p>setuptools可以为Python包创建 <a href="http://peak.telecommunity.com/DevCenter/PythonEggs">egg</a>文件，
Python 与 egg 文件的关系，相当于java与jar包的关系。 </p>

<p>setuptools 提供的 <a href="http://peak.telecommunity.com/DevCenter/EasyInstall">easy_install</a> 脚本可以用来安装 egg包。
另外， easy_install 可以自动从 <a href="https://pypi.python.org/pypi">PyPI</a> 上下载相关的包，并完成安装，升级。</p>

<p>easy_install 提供了多种安装,升级Python包的方式，例如：  </p>
<div class="highlight"><pre><code class="text language-text" data-lang="text">easy_install SQLObject
easy_install -f http://pythonpaste.org/package_index.html SQLObject
easy_install http://example.com/path/to/MyPackage-1.2.3.tgz
easy_install /my_downloads/OtherPackage-3.2.1-py2.3.egg
easy_install --upgrade PyProtocols
</code></pre></div>
<p>后来开发者们觉得 setuptools 开发的太慢了，fork出了 Distribute 项目，然后2013年8月，
Distribute 又合并回 setuptools 0.7。</p>

<h2>pip</h2>

<p>pip 是安装，管理Python包的工具。它是对 easy_install 的一种增强。
同样可以从 PyPI 上自动下载，安装包。</p>

<p>在pip中，  </p>

<ul>
<li>安装前所有需要的包都要先下载，所以不会出现安装了一部分，另一部分没安装的情况</li>
<li>所有安装的包会被跟踪，所以你可以知道为什么他们被安装，同时可以卸载。 </li>
<li>无需使用 egg 文件。 </li>
</ul>

<p>使用方式简单：</p>
<div class="highlight"><pre><code class="text language-text" data-lang="text">pip install pkg_name
pip uninstall pkg_name
</code></pre></div>
<h2>总结</h2>

<p>用 <code>pip</code> 吧！</p>

<h2>参考资料</h2>

<ul>
<li><a href="http://docs.python.org/2/distutils/introduction.html">An Introduction to Distutils</a></li>
<li><a href="http://www.ibm.com/developerworks/cn/linux/sdk/python/charm-19/">可爱的 Python: pydoc 和 distutils 模块</a></li>
<li><a href="http://peak.telecommunity.com/DevCenter/setuptools">setuptools</a></li>
<li><a href="http://peak.telecommunity.com/DevCenter/EasyInstall">easy_install</a></li>
<li><a href="http://peak.telecommunity.com/DevCenter/PythonEggs">Python Egg</a></li>
<li><a href="http://www.pip-installer.org/en/latest/other-tools.html#pip-compared-to-easy-install">why pip</a></li>
<li><a href="http://stackoverflow.com/questions/6344076/differences-between-distribute-distutils-setuptools-and-distutils2">Differences between distribute, distutils, setuptools and distutils2?</a></li>
<li><a href="http://blog.yangyubo.com/2012/07/27/python-packaging/">Python 包工具之间的关系</a></li>
</ul>


      </article>

      <div class="comments">
        
          <div id="disqus_thread"></div>
 <script type="text/javascript">
     /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
     var disqus_shortname = 'minixalpha'; // required: replace example with your forum shortname

     /* * * DON'T EDIT BELOW THIS LINE * * */
     (function() {
         var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
         dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
         (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
     })();
 </script>
 <noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
    <a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
    

        
      </div>


      <footer>
        Copyright (c) minixalpha 2014
      </footer>

    </div>
  </body>
</html>
